package mq;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import bean.remote.SolicitudArticuloRemote;
import dominio.Estado;

@MessageDriven(mappedName = "jms/queue/deposito/receive", activationConfig = {
		@ActivationConfigProperty(propertyName = "clientId", propertyValue = "depositoClientID"),
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/queue/deposito/receive"),
		@ActivationConfigProperty(propertyName = "user", propertyValue = "test1"),
		@ActivationConfigProperty(propertyName = "password", propertyValue = "test12341"),
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
public class DepositoMQListener implements MessageListener {

	private final static Logger logger = Logger
			.getLogger(DepositoMQListener.class);

	@EJB(beanName = "solicitudArticuloBean")
	private SolicitudArticuloRemote solicitudArticuloRemote;

	@Override
	public void onMessage(Message message) {
		try {
			if (message == null) {
				throw new RuntimeException("El mensaje llego vacio");
			}

			if (message instanceof TextMessage) {
				TextMessage textMessage = (TextMessage) message;
				String text = textMessage.getText();

				InputStream articuloXml = new ByteArrayInputStream(
						text.getBytes());

				Long codigoSolicitudCompra = 0L;
				try {
					codigoSolicitudCompra = leer(articuloXml);
				} catch (ParserConfigurationException e) {
					logger.error("Error en el parseo de xml desde fabrica", e);
				} catch (SAXException e) {
					logger.error("Error en el parseo de xml desde fabrica", e);
				} catch (IOException e) {
					logger.error("Error en el parseo de xml desde fabrica", e);
				}

				solicitudArticuloRemote.recibirSolicitudCompra(codigoSolicitudCompra);
			}
		} catch (RuntimeException e) {
			logger.error(
					"Error general en la cola de mensajeria desde fabrica", e);
		} catch (JMSException e) {
			logger.error(
					"Error general en la cola de mensajeria desde fabrica", e);
		}
	}

	/**
	 * Devuelve el id de solicitud de compra
	 * 
	 * @param articuloXml
	 * @return
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public Long leer(InputStream articuloXml)
			throws ParserConfigurationException, SAXException, IOException {

		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		Document doc = dBuilder.parse(articuloXml);

		doc.getDocumentElement().normalize();

		System.out.println("Root element :"
				+ doc.getDocumentElement().getNodeName());

		String idSolicitud = doc.getElementsByTagName("idSolicitud").item(0)
				.getTextContent();

		String estado = doc.getElementsByTagName("estado").item(0)
				.getTextContent();

		if (Estado.ENTREGADA.toString().toLowerCase()
				.equalsIgnoreCase(estado.toLowerCase())) {
			return Long.valueOf(idSolicitud);
		}

		return null;
	}
}
